package com.winhc.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;

/**
 * 日期工具类
 * 
 * @author David.Huang
 */
public class DateUtil {
	
	public static final String FORMAT_DATE_10 = "yyyy-MM-dd";
	public static final String FORMAT_DATE_8 = "yyyyMMdd";
	public static final String FORMAT_DATE_6 = "yyMMdd";
	public static final String FORMAT_TIME_19 = "yyyy-MM-dd HH:mm:ss";
	public static final String FORMAT_TIME_14 = "yyyyMMddHHmmss";
	public static final String FORMAT_TIME_6 = "HHmmss";
	
	   public static final long m_second=1000;
	   public static final long m_minute=m_second*60;
	   public static final long m_hour=m_minute*60;
	   public static final long m_day=m_hour*24;	
	   

	/** yyyy-MM-dd */
	public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd";

	/** yyyyMMdd */
	public static final String FORMAT_YYYYMMDD = "yyyyMMdd";

	/** yyMMdd */
	public static final String FORMAT_YYMMDD = "yyMMdd";

	/** yyyy-MM-dd HH:mm:ss */
	public static final String FORMAT_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

	/** yyyyMMddHHmmss */
	public static final String FORMAT_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

	/** HH:mm:ss */
	public static final String FORMAT_HH_MM_SS = "HH:mm:ss";

	/** HHmmss */
	public static final String FORMAT_HHMMSS = "HHmmss";

	/**
	 * 字符串 转 日期
	 * 
	 * @param dateString 日期字符串
	 * @param pattern 格式化样式
	 * @return 日期对象
	 */
	public static final Date parseDate(String dateString, String pattern) {
		Date date = null;
		if (StringUtils.isEmpty(dateString)) return null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			date = sdf.parse(dateString);
		} catch (Exception e) {
			// do nothing
		}
		return date;
	}
	
	public static final Date parseDate_YYYY_MM_DD_HH_MM_SS(String dateString){
		return DateUtil.parseDate(dateString, FORMAT_YYYY_MM_DD_HH_MM_SS);
	}

	/**
	 * 日期对象格式化
	 * 
	 * @param date 日期对象
	 * @param pattern 格式化样式
	 * @return 字符串日期
	 */
	public static final String formatDate(Date date, String pattern) {
		String v = null;
		try {
			if (date == null) return null;
			SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
			v = dateFormat.format(date);
		} catch (Exception e) {
			// do nothing
		}
		return v;
	}
	
	public static final String formatDate_YYYY_MM_DD(Date date) {
		String v = null;
		try {
			if (date == null) return null;
			SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_YYYY_MM_DD);
			v = dateFormat.format(date);
		} catch (Exception e) {
			// do nothing
		}
		return v;
	}
	
	public static final String formatDate_YYYY_MM_DD_HH_MM_SS(Date date) {
		String v = null;
		try {
			if (date == null) return null;
			SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_YYYY_MM_DD_HH_MM_SS);
			v = dateFormat.format(date);
		} catch (Exception e) {
			// do nothing
		}
		return v;
	}

	/**
	 * 判断传入的日期是否是今天
	 * <p>
	 * 2002-03-28 13:45 和 2002-03-28 返回 true. 2002-03-12 13:45 和 2002-03-28 返回 false.
	 * </p>
	 * 
	 * @param date 需要判断的日期对象
	 * @return 是今天返回true,否则返回false
	 */
	public static boolean isToday(Date date) {
		if (date == null) return false;
		return DateUtils.isSameDay(date, new Date());
	}

	/**
	 * 判断时间是否早于当前时间
	 * <p>
	 * 例如:今天是2002-03-28 13:45:00, 传入2002-03-27 11:00:00 返回true,传入2002-03-28 11:00:00返回false
	 * </p>
	 * 
	 * @param date 需要判断的时间对象
	 * @return 如果传入的时间对象小于今天(时分秒都为0),则返回true,否则返回false
	 */
	public static boolean isBeforeToday(Date date) {
		if (date == null) return false;
		long today = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH).getTime();
		return date.getTime() < today;
	}

	/**
	 * 判断时间是否早于当前时间
	 * <p>
	 * 例如:今天是2002-03-28 13:45:00, 传入2002-03-27 11:00:00 返回true,传入2002-03-28 11:00:00返回false
	 * </p>
	 * 
	 * @param dateString 日期字符串
	 * @param sFormat 日期字符串的原始格式,例如yyyy-MM-dd
	 * @return
	 */
	public static boolean isBeforeToday(String dateString, String sFormat) {
		return isBeforeToday(parseDate(dateString, sFormat));
	}

	/**
	 * 日期字符串之间的类型转换.
	 * <p>
	 * 例如:convertDate("2012-01-02", "yyyy-MM-dd", "yyyy/mm/dd")返回2012/01/02
	 * </p>
	 * 
	 * @param source 待处理的日期字符串
	 * @param sformat 原来的格式
	 * @param dformat 新的格式
	 * @return 转换后的日期字符串
	 */
	public static String convertDate(String source, String sformat, String dformat) {
		// 参数检查
		if (StringUtils.isEmpty(source) || StringUtils.isEmpty(sformat) || StringUtils.isEmpty(dformat)) return source;
		// 开始转换
		String newString = formatDate(parseDate(source, sformat), dformat);
		// 如果转换失败返回原始字符串
		return (newString == null) ? source : newString;
	}

	/**
	 * 获得当前日期字符串,格式为 yyyyMMdd
	 * 
	 * @return 当前日期字符串(yyyyMMdd)
	 */
	public static String getCurrDate_YYYYMMDD() {
		return formatDate(new Date(), FORMAT_YYYYMMDD);
	}

	/**
	 * 获得当前日期字符串,格式为 HHmmss
	 * 
	 * @return 当前日期字符串(HHmmss)
	 */
	public static String getCurrDate_HHMMSS() {
		return formatDate(new Date(), FORMAT_HHMMSS);
	}
	
	/**
	 * 获得当前日期字符串,格式为 yyyy-MM-dd
	 * 
	 * @return 当前日期字符串(yyyy-MM-dd)
	 */
	public static String getCurrDate_YYYY_MM_DD() {
		return formatDate(new Date(), FORMAT_YYYY_MM_DD);
	}

	/**
	 * 获得当前日期字符串,格式为 yyyy-MM-dd HH:mm:ss
	 * 
	 * @return 当前日期字符串(yyyy-MM-dd HH:mm:ss)
	 */
	public static String getCurrDate_YYYY_MM_DD_HH_MM_SS() {
		return formatDate(new Date(), FORMAT_YYYY_MM_DD_HH_MM_SS);
	}

	/**
	 * 获得当前日期字符串,格式为 yyyyMMddHHmmss
	 * 
	 * @return 当前日期字符串(yyyyMMddHHmmss)
	 */
	public static String getCurrTime_YYYYMMDDHHMMSS() {
		return formatDate(new Date(), FORMAT_YYYYMMDDHHMMSS);
	}

	/**
	 * 判断是否是日期
	 * 
	 * @return dateString 日期字符串
	 * @param  pattern 格式化样式(yyyyMMddHHmmss)
	 * @return 是日期返回true, 否则返回false
	 */
	public static boolean isDateString(String dateString, String pattern) {
		boolean v = false;
		try {
			if (StringUtils.isNotEmpty(dateString)) {
				SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
				Date d = dateFormat.parse(dateString);
				if (d != null) {
					v = true;
				}
			}
		} catch (Exception e) {
			// do nothing
		}
		return v;
	}

	/**
	 * 判断是否是日期
	 * 
	 * @return dateString 日期字符串
	 * @param  pattern 格式化样式(yyyyMMddHHmmss)
	 * @return 不是日期返回true, 否则返回false
	 */
	public static boolean isNotDateString(String dateString, String pattern) {
		return !isDateString(dateString, pattern);
	}
	
	 public final static String getBetweenStr(Date beginDate, Date endDate) {
        if (beginDate == null || endDate == null){
            return null;
        }
        long time = endDate.getTime() - beginDate.getTime();
        long minute = (time / (60 * 1000));
        long second = (time / 1000 - minute * 60);
        if (time%1000 > 0) second+=1L;
        return minute + "\u5206" + second + "\u79d2";
    }
	 
		public static String getFormatDate(Date date, String format){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}
		
	 
	public static void main(String[] args) {
		Date start = parseDate_YYYY_MM_DD_HH_MM_SS("2013-7-30 12:00:06");
		Date end = parseDate_YYYY_MM_DD_HH_MM_SS("2013-7-30 12:00:07");
		System.out.println(getBetweenStr(start, end));
	}
}
